package pub.developers.forum.infrastructure;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.green.model.v20180509.TextScanRequest;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.profile.DefaultProfile;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import pub.developers.forum.domain.service.OssTxtService;

import java.io.UnsupportedEncodingException;
import java.util.*;

@Slf4j
@Data
@Component
public class OssTxtServiceImpl implements OssTxtService {
    private static final String region = "cn-shenzhen";

    private String accessKey;

    private String secretKey;

    //设置获取client
    private IAcsClient getClient() {
        DefaultProfile profile =  DefaultProfile.getProfile("cn-shenzhen", "LTAI5tJauxmFaobtVkgqg2Hb", "OkrjnoIAod8Oo8racrFM6RptKIjAHJ");
        DefaultProfile.addEndpoint("cn-shenzhen", "Green", "green.cn-shenzhen.aliyuncs.com");
        //实例化client , 重复使用可以提高检测性能
        // DefaultProfile profile1 = DefaultProfile.getProfile(region, accessKeyId, accessKeySecret);
        return new DefaultAcsClient(profile);
    }
   @Override
   public List<Map<String,String>>  checkText(String text) throws UnsupportedEncodingException {
       TextScanRequest textScanRequest = new TextScanRequest();
       textScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。
       textScanRequest.setHttpContentType(FormatType.JSON);
       textScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法。
       textScanRequest.setEncoding("UTF-8");
       textScanRequest.setRegionId(region);
       List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>();
       Map<String, Object> task1 = new LinkedHashMap<String, Object>();
       task1.put("dataId", UUID.randomUUID().toString());
       /**
        * 待检测的文本，长度不超过10000个字符。
        */
       task1.put("content", text);

       tasks.add(task1);
       JSONObject data = new JSONObject();

       /**
        * 检测场景。文本垃圾检测请传递antispam。
        **/
       data.put("scenes", Arrays.asList("antispam"));
       data.put("tasks", tasks);
       //////System.out.println(JSON.toJSONString(data, true));
       textScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON);
       // 请务必设置超时时间。
       textScanRequest.setConnectTimeout(3000);
       textScanRequest.setReadTimeout(6000);
       try {
           HttpResponse httpResponse = new OssTxtServiceImpl().getClient().doAction(textScanRequest);
           if(httpResponse.isSuccess()){
               JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
               //////System.out.println(JSON.toJSONString(scrResponse, true));
               if (200 == scrResponse.getInteger("code")) {

                   List<Map<String,String>> resultMaps = new ArrayList<>();
                   JSONArray taskResults = scrResponse.getJSONArray("data");
                   for (Object taskResult : taskResults) {
                       if(200 == ((JSONObject)taskResult).getInteger("code")){
                           JSONArray sceneResults = ((JSONObject)taskResult).getJSONArray("results");
                           for (Object sceneResult : sceneResults) {
                               String scene = ((JSONObject)sceneResult).getString("scene");
                               String suggestion = ((JSONObject)sceneResult).getString("suggestion");
                               // 根据scene和suggetion做相关处理。
                               // suggestion为pass表示未命中垃圾。suggestion为block表示命中了垃圾，可以通过label字段查看命中的垃圾分类。
                               //////System.out.println("args = [" + scene + "]");
                               //////System.out.println("args = [" + suggestion + "]");

                               Map<String, String> resultMap = new HashMap<>();
                               resultMap.put("scene",scene);
                               resultMap.put("suggestion",suggestion);
                               resultMaps.add(resultMap);
                           }
                       }else{
                           //////System.out.println("task process fail:" + ((JSONObject)taskResult).getInteger("code"));
                       }
                   }
                   return resultMaps;
               } else {
                   //////System.out.println("detect not success. code:" + scrResponse.getInteger("code"));
               }
           }else{
               //////System.out.println("response not success. status:" + httpResponse.getStatus());
           }
       } catch (Exception e){
           log.error("checkText is error" , e);
       }
       return null;
   }
}